package com.knowledge.plus.other.获取resources下的文件;

import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author TPF
 * @since 2022/11/4
 */
public class GetResFileStream {

    /**
     * 前三种方法在开发环境(IDE中)和生产环境(linux部署成jar包)都可以读取到，第四种只有开发环境 时可以读取到，生产环境读取失败。
     * 推测主要原因是springboot内置tomcat，打包后是一个jar包，无法直接读取jar包中的文件，读取只能通过类加载器读取。
     * 前三种都可以读取到其实殊途同归，直接查看底层代码都是通过类加载器读取文件流，类加载器可以读取jar包中的编译后的class文件，当然也是可以读取jar包中的excle模板了。
     *
     * 总结一下：
     * 假如文件是在jar包中，读取方式应当使用基于类加载器读取文件流的方式，比如前三种方法；使用基于java中File方式的读取，在jar包情况下是读取不到的，比方说第四种。
     */
    public void getResFileStream() throws IOException {
        // 1.
        ClassPathResource classPathResource = new ClassPathResource("excleTemplate/test.xlsx");
        InputStream inputStream1 = classPathResource.getInputStream();

        // 2.
        InputStream inputStream2 = Thread.currentThread().getContextClassLoader().getResourceAsStream("excleTemplate/test.xlsx");

        // 3. 在开发环境(IDE中)和生产环境(linux部署成jar包)都可以读取到
        InputStream inputStream3 = this.getClass().getResourceAsStream("/excleTemplate/test.xlsx");

        // 4. 只有开发环境时可以读取到，生产环境读取失败
        File file = ResourceUtils.getFile("classpath:excleTemplate/test.xlsx");
        InputStream inputStream4 = new FileInputStream(file);

    }

}
